package com.datareport.config.datasource;

import lombok.extern.slf4j.Slf4j;

/**
 * 数据源上下文管理器
 * 用于管理当前线程使用的数据源
 */
@Slf4j
public class DataSourceContextHolder {

    /**
     * 数据源类型枚举
     */
    public enum DataSourceType {
        BUSINESS_DB("business_db", "业务数据库"),
        STATISTICS_DB("statistics_db", "统计结果库"),
        SYSTEM_DB("system_db", "系统配置库");

        private final String code;
        private final String description;

        DataSourceType(String code, String description) {
            this.code = code;
            this.description = description;
        }

        public String getCode() {
            return code;
        }

        public String getDescription() {
            return description;
        }

        public static DataSourceType fromCode(String code) {
            for (DataSourceType type : values()) {
                if (type.code.equals(code)) {
                    return type;
                }
            }
            return BUSINESS_DB; // 默认返回业务数据库
        }
    }

    private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();

    public static void setDataSourceType(DataSourceType dataSourceType) {
        contextHolder.set(dataSourceType.getCode());
    }

    public static DataSourceType getDataSourceType() {
        return DataSourceType.fromCode(contextHolder.get());
    }

    public static void clearDataSourceType() {
        contextHolder.remove();
    }

    /**
     * 设置数据源
     */
    public static void setDataSource(String dataSource) {
        contextHolder.set(dataSource);
        log.debug("切换到数据源: {}", dataSource);
    }

    /**
     * 获取当前数据源
     */
    public static String getDataSource() {
        return contextHolder.get();
    }

    /**
     * 清除数据源
     */
    public static void clearDataSource() {
        contextHolder.remove();
        log.debug("清除数据源上下文");
    }

    /**
     * 设置业务数据库
     */
    public static void setBusinessDb() {
        setDataSource(DataSourceType.BUSINESS_DB.getCode());
    }

    /**
     * 设置统计结果库
     */
    public static void setStatisticsDb() {
        setDataSource(DataSourceType.STATISTICS_DB.getCode());
    }

    /**
     * 设置系统配置库
     */
    public static void setSystemDb() {
        setDataSource(DataSourceType.SYSTEM_DB.getCode());
    }

    /**
     * 判断是否为业务数据库
     */
    public static boolean isBusinessDb() {
        return DataSourceType.BUSINESS_DB.getCode().equals(getDataSource());
    }

    /**
     * 判断是否为统计结果库
     */
    public static boolean isStatisticsDb() {
        return DataSourceType.STATISTICS_DB.getCode().equals(getDataSource());
    }

    /**
     * 判断是否为系统配置库
     */
    public static boolean isSystemDb() {
        return DataSourceType.SYSTEM_DB.getCode().equals(getDataSource());
    }
}